{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 导入库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "6d4e59fa-5ba5-4237-afe3-5b136dd49763"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   PassengerId  Survived  Pclass  \\\n",
      "0            1         0       3   \n",
      "1            2         1       1   \n",
      "2            3         1       3   \n",
      "3            4         1       1   \n",
      "4            5         0       3   \n",
      "\n",
      "                                                Name     Sex   Age  SibSp  \\\n",
      "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
      "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
      "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
      "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
      "4                           Allen, Mr. William Henry    male  35.0      0   \n",
      "\n",
      "   Parch            Ticket     Fare Cabin Embarked  \n",
      "0      0         A/5 21171   7.2500   NaN        S  \n",
      "1      0          PC 17599  71.2833   C85        C  \n",
      "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
      "3      0            113803  53.1000  C123        S  \n",
      "4      0            373450   8.0500   NaN        S  \n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from IPython.display import display # 使得我们可以对DataFrame使用display()函数\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 设置以内联的形式显示matplotlib绘制的图片（在notebook中显示更美观）\n",
    "%matplotlib inline\n",
    "\n",
    "df = pd.read_csv('train.csv')\n",
    "df2 = pd.read_csv('test.csv')\n",
    "\n",
    "'''\n",
    "分类问题：监督学习，二分类\n",
    "'''\n",
    "\n",
    "print df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "a859484d-d71a-4448-85c2-fda7f2211eb6"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                             Name   Sex    Ticket        Cabin Embarked\n",
      "count                         891   891       891          204      889\n",
      "unique                        891     2       681          147        3\n",
      "top     Graham, Mr. George Edward  male  CA. 2343  C23 C25 C27        S\n",
      "freq                            1   577         7            4      644\n",
      "Index([u'PassengerId', u'Survived', u'Pclass', u'Name', u'Sex', u'Age',\n",
      "       u'SibSp', u'Parch', u'Ticket', u'Fare', u'Cabin', u'Embarked'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "## 【空值处理】-判断一个数是否是NaN\n",
    "#np.isnan()\n",
    "\n",
    "## 【空值处理】判断是否为空\n",
    "#   df.isnull()\n",
    "\n",
    "## pandas填充空值，fillna\n",
    "df.fillna({'Age': df.loc[:,'Age'].mean(), 'Fare':df.loc[:,'Fare'].mean()}, inplace=True )\n",
    "df2.fillna(df2.loc[:,'Age'].mean(), inplace = True)\n",
    "\n",
    "# Which features contain blank, null or empty values?\n",
    "\n",
    "# These will require correcting.\n",
    "\n",
    "# Cabin > Age > Embarked features contain a number of null values in that order for the training dataset.\n",
    "# Cabin > Age are incomplete in case of test dataset.\n",
    "\n",
    "# print df.columns\n",
    "# print df.info()  # 数据类型，type\n",
    "# print df.describe()            # 数值特征的分布\n",
    "print df.describe(include=['O']) # 分类特征的分布\n",
    "print df.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 探索性数据分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "5a5af00a-ffda-4baa-ba28-cfa28dae16a9"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.629630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.472826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0.242363</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pclass  Survived\n",
       "0       1  0.629630\n",
       "1       2  0.472826\n",
       "2       3  0.242363"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Sex</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>female</td>\n",
       "      <td>0.742038</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>male</td>\n",
       "      <td>0.188908</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Sex  Survived\n",
       "0  female  0.742038\n",
       "1    male  0.188908"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.535885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.464286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.345395</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.166667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>8</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SibSp  Survived\n",
       "1      1  0.535885\n",
       "2      2  0.464286\n",
       "0      0  0.345395\n",
       "3      3  0.250000\n",
       "4      4  0.166667\n",
       "5      5  0.000000\n",
       "6      8  0.000000"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Parch</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.600000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.550847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.343658</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Parch  Survived\n",
       "3      3  0.600000\n",
       "1      1  0.550847\n",
       "2      2  0.500000\n",
       "0      0  0.343658\n",
       "5      5  0.200000\n",
       "4      4  0.000000\n",
       "6      6  0.000000"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "## 0.1 基于【数据分析】的 假设\n",
    "## 特征跟最后结果【相关性】的人工经验 假设\n",
    "\n",
    "'''\n",
    "1、可能相关特征：Age， Embarked， Pclass\n",
    "2、可能丢弃的特征：\n",
    "Ticket：重复率相对较高：210/891 = 22% |  可能与存活无关\n",
    "Cabin：包含很多空值\n",
    "PassengerID：序号\n",
    "Name：不是相对的衡量标准，对存活情况可能无关，丢弃\n",
    "3、特征转换：\n",
    "Why：指标评估 + 可解释性 + 场景\n",
    "家庭成员特征:   SibSp + Parch，人工经验，组合父母和兄弟\n",
    "Name：       Title有效特征\n",
    "年龄特征：    数值特征转化为类别特征\n",
    "费用特征：    数值特征转化为类别特征\n",
    "\n",
    "4、假设：\n",
    "女性，小孩，头等舱生存更可能生存\n",
    "'''\n",
    "\n",
    "## 0.2 快速验证 验证1：Pclass\n",
    "# 验证方法：Groupby后获取每个分组的平均值，即得到生存率。生存人数 / 总人数\n",
    "# DataFrame 排序df.sort_values(by = 列名，,ascending)\n",
    "display(df[['Pclass','Survived']].groupby(['Pclass'], as_index = False).mean().sort_values( by = 'Survived', ascending = False))\n",
    "\n",
    "# 说明Pclass特征与生存相关\n",
    "\n",
    "# 验证2：Sex\n",
    "display(df[['Sex','Survived']].groupby(['Sex'], as_index = False).mean().sort_values(by = 'Survived', ascending = False))\n",
    "\n",
    "display(df[[\"SibSp\", \"Survived\"]].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False))\n",
    "\n",
    "display(df[[\"Parch\", \"Survived\"]].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "5f5be7c3-5358-46d8-bf8c-61ec3310cf8b"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.FacetGrid at 0x1262e9c90>"
      ]
     },
     "execution_count": 223,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nyOAkSZJUyOAkSZJUyOAkSZJUyOAkSZJUyOAkSZJUyOAkSZJUyOAkSZJUaELBKSK+HREPR8Rb+8oP\njohvRcR9EfHPEXFU3/ZXRcQtEfFgRFwXEQdOpvOSJElTaULBKTOPAM7tLYuIvYFrgU8CTwGWARdF\nxPPq7YcAy4E3AkPAJcC1EbHbhHsvSZI0hSZzqi76np8EXJ6Zl2fmpsz8LvBe4OR6++nABzJzZWZu\nycwLgBuAEyfRB0mSpCnT5Bqnu4GL+8ruBBbXXx8GXNm3/TLgyAb7IEmS1JoFTR0oM788oPgVwI31\n1/tm5k/7tt8CHNBUHyRJktrU2lV1EXEEcDTw6a1FA6ptABa11QdJkqQmNTbj1CsingGsAF6TmQ/U\nxY8MqPokYH0bfZAkSWpa48EpIoaArwPvzsyVPZv+PSKenpk/6ynbH+g/fbeNZcuWMTQ0tE1Zp9Oh\n0+k01WVJ06Db7dLtdrcrHxkZ6WTm9hta4PgizU1tji+RmRPbMeJsYF1mfrin7HHAN4AfZubb++ov\nB27KzE/3lF0CjGTmFwccfxgYHR0dZXh4eEJ9lDQrDTqt32wDji/SfDXp8aXpGaflwIPAOwZs+wRw\ndUT8ELiJ6vYFh+DtCCRJ0izRWHCKiLdR3bPpEeChiEiqZHd7Zj47M38cEWdQrX16GvB94JjM3NxU\nHyRJkto04eCUmef2PT8POG+Mfa4Crppom5IkSdPJD/mVJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCS\nJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkq\nZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqZHCSJEkqNKHg\nFBHfjoiHI+KtfeUHRcT1EbE+IlZFxNF9218VEbdExIMRcV1EHDiZzkuSJE2lCQWnzDwCOLe3LCJ2\nA64GLgb2Ak4DLoqIg+vthwDLgTcCQ8AlwLX1fpIkSTPeZE7VRd/z44FVmbk8M7dk5kqqcPW2evvp\nwAcyc2W9/QLgBuDESfRBkiRpyjS5xukw4Mq+ssuAIwu3S5IkzWhNBqclwK29BZl5D7CwPh23b2b+\ntG+fW4ADGuyDJElSa5oMTouA9QPKN9TbBrW1dZskSdKM12Rw2gAsHFC+N1WgemTAticxOGxJkiTN\nOAsaPNYaYH9g5daCiFgM3JuZmyPi3yPi6Zn5s5599gf6T99tY9myZQwNDW1T1ul06HQ6zfVc0pTr\ndrt0u93tykdGRjqZuf2GFji+SHNTm+NLZObEdow4G1iXmR+un3eAYzPzxJ46fwoMZ+bJEXEBMJqZ\nn+7ZfgkwkplfHHD8YWB0dHSU4eHhCfVR0qzUf8Vu8w04vkjz1aTHlyZP1V0OvCgilkbEgog4FDgT\nOK/efj5wVkS8uN5+MnAIMCXvLCVJkiarseCUmZuAY4FTgXXAhcApmbm63v5j4AxgBXAf1f2bjsnM\nzU31QZIkqU0TXuOUmecOKLuZ6n5NO9rnKuCqibYpSZI0nfyQX0mSpEIGJ0mSpEIGJ0mSpEIGJ0mS\npEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIG\nJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mSpEIGJ0mS\npEKNBqeI2DsiVkTEPRHxbxGxrGfbQRFxfUSsj4hVEXF0k21LkiS1rekZpy8Aq4GnAS8CfiMiXhsR\nuwFXAxcDewGnARdFxMENty9JktSaBQ0f7zDg9zJzC7AhIv4WOAPYDKzKzOV1vZURcS7wduB1DfdB\nkiSpFU3POH0d+GBE7BURTwf+AriLKlBd2Vf3MuDIhtuXJElqTdPB6b8DxwP/CdwBLAbOBZYAt/ZW\nzMx7gN0jYteG+yBJktSKxoJTRCygmnFaAfwKsD/wXeDJwCJg/YDdNtbbJEmSZrwm1zgdCzyQmWfV\nz++PiHdRhaefAQsH7LM3gwOVJEnSjNNkcHoWcH1vQWbeFxGbgT2oZqBWbt0WEYuBe+qF5Du0bNky\nhoaGtinrdDp0Op2m+i1pGnS7Xbrd7nblIyMjnczcfkMLHF+kuanN8SUyczL7P3agiFcDr87ME3vK\n9gTWAG8Gjuvb9qfAcGaevIPjDQOjo6OjDA8PN9JHSbNCtN6A44s0X016fGlycfgI8IKIOC0iHl9f\nVfdF4CrgCuDFEbE0IhZExKHAmcB5DbYvSZLUqsaCU2Y+BLwCeCXwC6rTcrcBb8rMTfW2U4F1wIXA\nKZm5uqn2JUmS2tboDTAz8zbgqB1su5nqfk6SJEmzkh/yK0mSVMjgJEmSVMjgJEmSVMjgJEmSVMjg\nJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmS\nVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVKjV4BQRSyLi\n9W22IUmSNFXannH6GLD31icRcVBEXB8R6yNiVUQc3XL7kiRJjWktOEXEMcD+wEfr57sBVwMXA3sB\npwEXRcTBbfVBkiSpSa0EpzokfQQ4NTMfqYuPB1Zl5vLM3JKZK4Fzgbe30QdJkqSmtTXj9A7gu5n5\njz1lhwFX9tW7DDiypT5IkiQ1qvHgFBFPA94JHBUR90bEeRERwBLg1t66mXkPsHtE7Np0PyRJkprW\nxozTu4FvAsPAC4CXAKcDC4H1A+pvBBa10A9JkqRGLWjhmMcBz87M+4F7IuKPga8Ct1GFp357MzhQ\nSZIkzSiNBqeI2Ad4oA5NAGTmT+rTd9+huspuZU/9xcA9mbllR8dctmwZQ0ND25R1Oh06nU6TXZc0\nxbrdLt1ud7vykZGRTmZuv6EFji/S3NTm+BKZOZn9tz1YtZZpLXBAZt5Xlx0MdIH3A8dl5ok99f8U\nGM7MkwccaxgYHR0dZXh4uLE+SprxovUGHF+k+WrS40uja5yySmGfB74QEU+OiP2BC6nu5XQF8KKI\nWBoRCyLiUOBM4Lwm+yBJktSWNhaH/zlwO/Bj4Drgy5n52czcBBwLnAqsowpUp2Tm6hb6IEmS1LjG\nF4dn5kPAsvrRv+1mqvs5SZIkzTptf1adJEnSnGFwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJ\nKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRw\nkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKmRwkiRJKtRqcIqIMyNi7/rr\ngyLi+ohYHxGrIuLoNtuWJElqWmvBKSIOAd5bf70bcDVwMbAXcBpwUUQc3Fb7kiRJTWslOEXErsCX\ngMfVRccDqzJzeWZuycyVwLnA29toX5IkqQ1tzTi9F/jfwJ3188OAK/vqXAYc2VL7kiRJjWs8OEXE\nS4ATgNN7ipcAt/bWy8x7gN3r2SlJkqQZr9HgFBF7Ap8DXp+Z63o2LQLWD9hlY71NkiRpxlvQ8PE+\n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\nKx8ZGelk5vYbWuD4Is1NbY4vkZkT2zHibGBdZn64r3wI+HvgI5n5mZ7yHwNHZ+bPespeA7w8M08a\ncPxhYHR0dJTh4eEJ9VHSrDRodrrZBhxfpPlq0uNLo6fqIuJxVLcZuKY3NNVWUp266/X7wHVN9kGS\nJKktTZ+qWw48CLxjwLZPAFdHxA+Bm6huX3AI3o5AkiTNEo0Fp4h4G9U9mx4BHoqIpJoSuz0zn52Z\nP46IM6jWPj0N+D5wTGZubqoPkiRJbZpwcMrMc/uenwecN8Y+VwFXTbRNSZKk6eSH/EqSJBUyOEmS\nJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUy\nOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmSJBUyOEmS\nJBUyOEmSJBUyOEmSJBWaUHCKiG9HxMMR8da+8oMi4vqIWB8RqyLi6L7tr4qIWyLiwYi4LiIOnEzn\nJUmSptKEglNmHgGc21sWEbsBVwMXA3sBpwEXRcTB9fZDgOXAG4Eh4BLg2no/SZKkGW8yp+qi7/nx\nwKrMXJ6ZWzJzJVW4elu9/XTgA5m5st5+AXADcOIk+iBJkjRlmlzjdBhwZV/ZZcCRhdslSZJmtCaD\n0xLg1t6CzLwHWFifjts3M3/at88twAEN9kGSJKk1TQanRcD6AeUb6m2D2tq6TZIkacZb0OCxNgAL\nB5TvTRWoHhmw7UkMDluPWrZsGUNDQ9uUdTodOp3OBLspaSbodrt0u93tykdGRjqZuf2GFji+SHNT\nm+NLZObEdow4G1iXmR+un38S+EFmruipsxi4MTOXRMRPgKMy82c9218DvDwzTxpw/GFgdHR0lOHh\n4Qn1UdKs1H/hSfMNOL5I89Wkx5cmT9WtBI7uKzsBuG4n23+/Z7skSdKM1mRwuhx4UUQsjYgFEXEo\ncCZwXr39fOCsiHhxvf1k4BBgSqbkJUmSJqux4JSZm4BjgVOBdcCFwCmZubre/mPgDGAFcB/V/ZuO\nyczNTfVBkiSpTRNeHJ6Z5w4ou5nqfk072ucq4KqJtilJkjSd/JBfSZKkQgYnSZKkQgYnSZKkQgYn\nSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKk\nQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYnSZKkQgYn\nSZKkQo0Gp4jYOyJWRMQ9EfFvEbGsZ9tBEXF9RKyPiFURcXSTbUuSJLWt6RmnLwCrgacBLwJ+IyJe\nGxG7AVcDFwN7AacBF0XEwQ23L0mS1JoFDR/vMOD3MnMLsCEi/hY4A9gMrMrM5XW9lRFxLvB24HUN\n90GSJKkVTc84fR34YETsFRFPB/4CuIsqUF3ZV/cy4MiG25ckSWpN08HpvwPHA/8J3AEsBs4FlgC3\n9lbMzHuA3SNi14b7IEmS1IrGglNELKCacVoB/AqwP/Bd4MnAImD9gN021tskSZJmvCbXOB0LPJCZ\nZ9XP74+Id1GFp58BCwfsszeDA9Wjli1bxtDQ0DZlnU6HTqcz6Q5Lmj7dbpdut7td+cjISCczt9/Q\nAscXaW5qc3yJzJzM/o8dKOLtwO6Z+d6+8huA+4EvZOaKnvLFwI2ZuWQHxxsGRkdHRxkeHm6kj5Jm\nhWi9AccXab6a9PjS5Bqn24CDegsiYk/gQOAioP++TScA1zXYviRJUquaDE4jwAsi4rSIeHx9Vd0X\ngauAK4AXR8TSiFgQEYcCZwLnNdi+JElSqxoLTpn5EPAK4JXAL4CVVLNQb8rMTfW2U4F1wIXAKZm5\nuqn2JUmS2tboDTAz8zbgqB1su5nqfk6SJEmzkh/yK0mSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmS\nVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjg\nJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVMjgJEmSVKjV4BQRSyLi9W22\nIUmSNFXannH6GLD31icRcVBEXB8R6yNiVUQc3XL7kiRJjWktOEXEMcD+wEfr57sBVwMXA3sBpwEX\nRcTBbfVBkiSpSa0EpzokfQQ4NTMfqYuPB1Zl5vLM3JKZK4Fzgbe30QdJkqSmtTXj9A7gu5n5jz1l\nhwFX9tW7DDiypT5IkiQ1qvHgFBFPA94JHBUR90bEeRERwBLg1t66mXkPsHtE7Np0PyRJkprWxozT\nu4FvAsPAC4CXAKcDC4H1A+pvBBa10A9JkqRGRWY2e8CIu4FnZ+b99fODga8CtwF/U69t6q3/IDCU\nmVv6yoeB0cMPP5yhoaFt2uh0OnQ6nUb7LWlqdbtdut3uduUjIyMnZub2Gxrk+CLNbW2OL40Gp4jY\nB/hBZh7YV34fsAL4x8xc0VO+GLgxM5cMONYwMDo6Osrw8HBjfZQ040XrDTi+SPPVpMeXpk/V3QP8\nSkQ8+haunnG6A1gJ9N+36QTguob7IEmS1IpGg1NW01efB74QEU+OiP2BC6nu5XQF8KKIWBoRCyLi\nUOBM4Lwm+yBJktSWNhaH/zlwO/BjqtmkL2fmZzNzE3AscCqwjipQnZKZq1vogyRJUuMWNH3AzHwI\nWFY/+rfdTHU/J0mSpFmn7c+qkyRJmjMMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIk\nSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUM\nTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYUMTpIkSYVaDU4RcWZE7F1/fVBEXB8R\n6yNiVUQc3WbbkiRJTWstOEXEIcB76693A64GLgb2Ak4DLoqIg9tqX5IkqWmtBKeI2BX4EvC4uuh4\nYFVmLs/MLZm5EjgXeHsb7UuSJLWhrRmn9wL/G7izfn4YcGVfncuAI1tqX5IkqXGNB6eIeAlwAnB6\nT/ES4Nbeepl5D7B7PTslSZI04zUanCJiT+BzwOszc13PpkXA+gG7bKy3SZIkzXgLGj7ex4DLM/P6\nnrIANgALB9Tfm8GB6lHLli1jaGhom7JOp0On05lkVyVNp263S7fb3a58ZGSkk5nbb2iB44s0N7U5\nvkRmTmb/xw4UcQxwBfBwT/HuwCbgLuCczFzRU38xcGNmLtnB8YaB0dHRUYaHhxvpo6RZIVpvwPFF\nmq8mPb40dqouM6/JzN0zc4+tD+AOYF/gXUD/fZtOAK5rqn1JkqS2tX3n8KgflwMvioilEbEgIg4F\nzgTOa7l9SZKkxrQdnBIgMzcBxwKnAuuAC4FTMnN1y+1LkiQ1punF4dvIzAN6vr6Z6n5OkiRJs5If\n8itJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJ\nklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI4CRJklTI\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1262e9310>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "'''\n",
    "\n",
    "1、seaborn特征观察画图，验证，控制变量\n",
    "'''\n",
    "\n",
    "# 自己画\n",
    "# bins1 = np.arange(0, df['Age'].max() + 10, 10)      ## 直方图横轴的范围\n",
    "# sns.distplot(df[(df['Survived'] == 1) & (df['Sex'] == 'male')]['Age'], color='green', kde= False, bins=bins1)\n",
    "# sns.distplot(df[df['Sex'] == 'male']['Age'], color='red', kde= False, bins= bins1)\n",
    "\n",
    "# Kaggle Kernel 格子绘图，数值型\n",
    "# g = sns.FacetGrid(df, col='Survived')\n",
    "# g.map(plt.hist, 'Age', bins = 20)      # bins间隔\n",
    "\n",
    "# 格子绘图，两个条件，数值型\n",
    "grid = sns.FacetGrid(df, col = 'Survived', row = 'Pclass')\n",
    "grid.map(plt.hist, 'Age', bins = 20)\n",
    "\n",
    "# 格子绘图，分类型特征 【待】\n",
    "# gird = sns.FacetGrid(df, row = 'Survived', size=2.2, aspect=1.6)\n",
    "# grid.map(sns.pointplot, 'Pclass', 'Sex', palette = 'deep')\n",
    "# grid.add_legend()\n",
    "\n",
    "# 格子绘图，分类 + 数值型特征【待】"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "5c125e20-c7fe-4e62-9624-12eb1fecdf23"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     Survived                                               Name\n",
      "0           0                            Braund, Mr. Owen Harris\n",
      "1           1  Cumings, Mrs. John Bradley (Florence Briggs Th...\n",
      "2           1                             Heikkinen, Miss. Laina\n",
      "3           1       Futrelle, Mrs. Jacques Heath (Lily May Peel)\n",
      "4           0                           Allen, Mr. William Henry\n",
      "5           0                                   Moran, Mr. James\n",
      "6           0                            McCarthy, Mr. Timothy J\n",
      "7           0                     Palsson, Master. Gosta Leonard\n",
      "8           1  Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)\n",
      "9           1                Nasser, Mrs. Nicholas (Adele Achem)\n",
      "10          1                    Sandstrom, Miss. Marguerite Rut\n",
      "11          1                           Bonnell, Miss. Elizabeth\n",
      "12          0                     Saundercock, Mr. William Henry\n",
      "13          0                        Andersson, Mr. Anders Johan\n",
      "14          0               Vestrom, Miss. Hulda Amanda Adolfina\n",
      "15          1                   Hewlett, Mrs. (Mary D Kingcome) \n",
      "16          0                               Rice, Master. Eugene\n",
      "17          1                       Williams, Mr. Charles Eugene\n",
      "18          0  Vander Planke, Mrs. Julius (Emelia Maria Vande...\n",
      "19          1                            Masselmani, Mrs. Fatima\n",
      "20          0                               Fynney, Mr. Joseph J\n",
      "21          1                              Beesley, Mr. Lawrence\n",
      "22          1                        McGowan, Miss. Anna \"Annie\"\n",
      "23          1                       Sloper, Mr. William Thompson\n",
      "24          0                      Palsson, Miss. Torborg Danira\n",
      "25          1  Asplund, Mrs. Carl Oscar (Selma Augusta Emilia...\n",
      "26          0                            Emir, Mr. Farred Chehab\n",
      "27          0                     Fortune, Mr. Charles Alexander\n",
      "28          1                      O'Dwyer, Miss. Ellen \"Nellie\"\n",
      "29          0                                Todoroff, Mr. Lalio\n",
      "..        ...                                                ...\n",
      "861         0                        Giles, Mr. Frederick Edward\n",
      "862         1  Swift, Mrs. Frederick Joel (Margaret Welles Ba...\n",
      "863         0                  Sage, Miss. Dorothy Edith \"Dolly\"\n",
      "864         0                             Gill, Mr. John William\n",
      "865         1                           Bystrom, Mrs. (Karolina)\n",
      "866         1                       Duran y More, Miss. Asuncion\n",
      "867         0               Roebling, Mr. Washington Augustus II\n",
      "868         0                        van Melkebeke, Mr. Philemon\n",
      "869         1                    Johnson, Master. Harold Theodor\n",
      "870         0                                  Balkic, Mr. Cerin\n",
      "871         1   Beckwith, Mrs. Richard Leonard (Sallie Monypeny)\n",
      "872         0                           Carlsson, Mr. Frans Olof\n",
      "873         0                        Vander Cruyssen, Mr. Victor\n",
      "874         1              Abelson, Mrs. Samuel (Hannah Wizosky)\n",
      "875         1                   Najib, Miss. Adele Kiamie \"Jane\"\n",
      "876         0                      Gustafsson, Mr. Alfred Ossian\n",
      "877         0                               Petroff, Mr. Nedelio\n",
      "878         0                                 Laleff, Mr. Kristo\n",
      "879         1      Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)\n",
      "880         1       Shelley, Mrs. William (Imanita Parrish Hall)\n",
      "881         0                                 Markun, Mr. Johann\n",
      "882         0                       Dahlberg, Miss. Gerda Ulrika\n",
      "883         0                      Banfield, Mr. Frederick James\n",
      "884         0                             Sutehall, Mr. Henry Jr\n",
      "885         0               Rice, Mrs. William (Margaret Norton)\n",
      "886         0                              Montvila, Rev. Juozas\n",
      "887         1                       Graham, Miss. Margaret Edith\n",
      "888         0           Johnston, Miss. Catherine Helen \"Carrie\"\n",
      "889         1                              Behr, Mr. Karl Howell\n",
      "890         0                                Dooley, Mr. Patrick\n",
      "\n",
      "[891 rows x 2 columns]\n"
     ]
    }
   ],
   "source": [
    "\n",
    "'''\n",
    "1.1.0 去除所观察的无用特征列 \n",
    "'''\n",
    "# labels_train = df['Survived']\n",
    "# features_train = df.drop('Survived', 1)\n",
    "# features_train = df.drop('Name', 1)\n",
    "\n",
    "# features_test = df2.drop('Name', 1)\n",
    "\n",
    "# 1.1 探索，确定特征\n",
    "# features = ['Pclass', 'Age', 'Sex', 'Fare', 'Embarked', 'Name', 'SibSp', 'Parch']\n",
    "# print df.head(2)\n",
    "# features_train = df.loc[:,features]\n",
    "# labels_train = df.loc[:,'Survived']\n",
    "# features_test = df2.loc[:,features]\n",
    "\n",
    "features_train = df.drop( ['Ticket', 'Cabin'], axis=1)\n",
    "labels_train = df.loc[:, 'Survived']\n",
    "features_test = df2.drop( ['Ticket', 'Cabin'], axis=1)\n",
    "print features_train.loc[:, ['Survived', 'Name']]\n",
    "\n",
    "# 后续创建新特征等极大可能将train 和 test 一起操作，故combine\n",
    "combine = [features_train, features_test]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "818f9beb-72ca-4a41-a918-3e5f1b6c38ab"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "        Survived\n",
      "title           \n",
      "Mrs     0.793651\n",
      "Miss    0.702703\n",
      "Master  0.575000\n",
      "Rare    0.347826\n",
      "Mr      0.156673\n"
     ]
    }
   ],
   "source": [
    "'''\n",
    "1.1.1 从已有特征中派生新特征\n",
    "\n",
    "姓名 - 姓名数据中提取有用的信息, Mr, Miss, Mrs\n",
    "\n",
    "Observations.\n",
    "\n",
    "When we plot Title, Age, and Survived, we note the following observations.\n",
    "\n",
    "Most titles band Age groups accurately:. For example: Master title has Age mean of 5 years.\n",
    "Survival among Title Age bands varies slightly.\n",
    "Certain titles mostly survived (Mme, Lady, Sir) or did not (Don, Rev, Jonkheer).\n",
    "'''\n",
    "\n",
    "# 验证\n",
    "\n",
    "for dataset in combine:\n",
    "    dataset['title'] = dataset.Name.str.extract(' ([A-Za-z]+)\\.', expand=False)\n",
    "\n",
    "## pandas 交叉表和透视表 https://blog.csdn.net/bqw18744018044/article/details/80015840\n",
    "\n",
    "pd.crosstab( features_train['title'], features_train['Sex'])\n",
    "\n",
    "# 与性别特征相关为啥不去掉？ 因为Master？大部分是男性，又是小孩？ 【待】\n",
    "\n",
    "# 初步验证成功。分类，人工经验，其他 -> Rare\n",
    "\n",
    "for dataset in combine:\n",
    "    dataset['title'] = dataset['title'].replace(['Lady', 'Countess','Capt', 'Col',\\\n",
    "                                                 'Don', 'Dr', 'Major', 'Rev', 'Sir',\\\n",
    "                                                 'Jonkheer', 'Dona'], 'Rare')\n",
    "\n",
    "    dataset['title'] = dataset['title'].replace('Mlle', 'Miss')\n",
    "    dataset['title'] = dataset['title'].replace('Ms', 'Miss')\n",
    "    dataset['title'] = dataset['title'].replace('Mme', 'Mrs')\n",
    "    \n",
    "# 新特征与目标相关性验证\n",
    "\n",
    "print features_train[ ['Survived', 'title'] ].groupby('title').mean().sort_values(by = 'Survived', ascending = False)\n",
    "\n",
    "# 分类 -> 值 \n",
    "title_mapping = {\"Mr\": 1, \"Miss\": 2, \"Mrs\": 3, \"Master\": 4, \"Rare\": 5}\n",
    "for dataset in combine:\n",
    "    dataset['title'] = dataset['title'].map(title_mapping)   # 分类.map -> 值\n",
    "    dataset['title'] = dataset['title'].fillna(0)\n",
    "    # dataset = dataset.drop( ['Name'], axis=1)              # 直接给dataset赋值并不会改变？【待】\n",
    "    dataset.drop( ['Name'], axis=1, inplace=True)            \n",
    "\n",
    "# drop name\n",
    "# drop 返回drop后的df，但不会改变原来的df\n",
    "# features_train.drop( ['Pclass'], axis=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "725bda43-19a6-4381-8b4a-3abce2d82e22"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex   Age  SibSp  Parch     Fare Embarked  \\\n",
       "0            1         0       3    0  22.0      1      0   7.2500        S   \n",
       "1            2         1       1    1  38.0      1      0  71.2833        C   \n",
       "2            3         1       3    1  26.0      0      0   7.9250        S   \n",
       "3            4         1       1    1  35.0      1      0  53.1000        S   \n",
       "4            5         0       3    0  35.0      0      0   8.0500        S   \n",
       "\n",
       "   title  \n",
       "0      1  \n",
       "1      3  \n",
       "2      2  \n",
       "3      3  \n",
       "4      1  "
      ]
     },
     "execution_count": 226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 转换类别特征 \n",
    "for dataset in combine:\n",
    "     dataset['Sex'] = dataset['Sex'].map( {'female': 1, 'male': 0} ).astype(int)\n",
    "        \n",
    "features_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "43a93303-d239-4f68-9f1e-400f4a4ec2ae"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>22</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>38</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>26</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>35</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age  SibSp  Parch     Fare Embarked  \\\n",
       "0            1         0       3    0   22      1      0   7.2500        S   \n",
       "1            2         1       1    1   38      1      0  71.2833        C   \n",
       "2            3         1       3    1   26      0      0   7.9250        S   \n",
       "3            4         1       1    1   35      1      0  53.1000        S   \n",
       "4            5         0       3    0   35      0      0   8.0500        S   \n",
       "\n",
       "   title  \n",
       "0      1  \n",
       "1      3  \n",
       "2      2  \n",
       "3      3  \n",
       "4      1  "
      ]
     },
     "execution_count": 227,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nDBx66KGrjjnmmGx89Pf3J8UEggl7dEMMxmZs3fAwttHFUW3HjjnmmIyIzzI+bE+NzdiMbdLHNu5t\naWa29aBY8PrMStm2wL8DH2+y/4XA2ytlVwEnDHP+XiAHBgayG82ZM2eiQxiWsbXH2NpjbO0Drs82\n2+BWHran7TO29hhbe4ytPZ1qS2ubuFe6EFgF/H2TbRcAN0TETynuKnQCcAAuASdJkqQuU1uSHBHv\nplgTeQOwLiKSYrLefZn5/My8IyLeRTFWeeiOe0dncU97SZIkqWu0nSRn5rmV5+cD52/mmOuB69ut\nU5IkSRoPHVsCTpIkSZqsTJLb1NfXN9EhDMvY2mNs7TG2Memf6AC6QTd/TsbWHmNrj7G1rSNtaRST\nArtPRPQCAwMDA/T29k50OJLUCc1uslR/JbankrZsHWlL7UmWJEmSKkySJUmSpAqTZEmSJKnCJFmS\nJEmqMEmWJEmSKkySJUmSpAqTZEmSJKnCJFmSJEmqMEmWJEmSKkySJUmSpAqTZEmSJKnCJFmSJEmq\nMEmWJEmSKtpKkiPi+xHxZEScWSnfLyLmR8RgRCyMiKMq218XEb+IiFURcWNE7DuW4CVJkqROaCtJ\nzszDgXMbyyJiGnADcAWwE3AacElE7F9uPwC4EDgZ6AGuAr5THidJkiR1jbEMt4jK82OBhZl5YWY+\nkZkLKBLpd5fbTwc+lpkLyu0XAbcAx40hBkmSJKl2dY5JPgS4rlJ2NXDEKLdLkiRJXaHOJHkv4O7G\ngsxcBkwvh1TskZn3Vo75BbBPjTFIkiRJY1ZnkjwDGGxSvrrc1qyuoW2SJElS15hS47lWA9OblM+i\nSJ43NNm2C80T66fMnTuXnp6ejcr6+vro6+trM0xJGl/9/f309/dvUj5v3ry+zNx0Q4fYnkqazMa7\nLY3MbO/AiHOAlZn5L+XzzwE3Z+blDfvMBm7NzL0i4k7gyMz8bcP2vwZenZknNDl/LzAwMDBAb29v\nWzFKUperToDuTCW2p5K2bB1pS+scbrEAOKpS9kbgxhG2/1XDdkmSJKkr1JkkXwMcFBHHR8SUiDgY\nOAs4v9z+WeD9EfGScvtJwAHAuF1qlCRJkkajtiQ5M9cCc4BTgZXAxcApmbmo3H4H8C7gcmAFxfrI\nR2fm+rpikCRJkurQ9sS9zDy3SdldFOshD3fM9cD17dYpSZIkjYc6h1tIkiRJWwSTZEmSJKnCJFmS\nJEmqMEmWJEmSKkySJUmSpAqTZEmSJKnCJFmSJEmqMEmWJEmSKkySJUmSpAqTZEmSJKnCJFmSJEmq\nMEmWJEmSKkySJUmSpAqTZEmSJKnCJFmSJEmqqDVJjohZEXF5RCyLiF9HxNyGbftFxPyIGIyIhRFx\nVJ11S5IkSXWpuyf5y8AiYE/gIODPI+ItETENuAG4AtgJOA24JCL2r7l+SZIkacym1Hy+Q4DXZ+YT\nwOqI+DzwLmA9sDAzLyz3WxAR5wLvAU6sOQZJkiRpTOruSf4m8ImI2Cking28D1hMkTxfV9n3auCI\nmuuXJEmSxqzuJPlvgWOB5cD9wGzgXGAv4O7GHTNzGbBdREytOQZJkiRpTGpLkiNiCkVP8uXAzsBz\ngZuA3YAZwGCTw9aU2yRJkqSuUeeY5DnA45n5/vL5YxHxDxSJ8m+B6U2OmUXz5FmSJEmaMHUmyc8D\n5jcWZOaKiFgPzKToWV4wtC0iZgPLykl+w5o7dy49PT0blfX19dHX11dX3JLUUf39/fT3929SPm/e\nvL7M3HRDh9ieSprMxrstjcys50QRbwDekJnHNZTtAPwGeCdwTGXbGUBvZp40zPl6gYGBgQF6e3tr\niVGSukyMSyW2p5K2bB1pS+ucuDcPODAiTouI7cvVLb4CXA9cC7wkIo6PiCkRcTBwFnB+jfVLkiRJ\ntagtSc7MdcBrgNcCD1MMrbgHeEdmri23nQqsBC4GTsnMRXXVL0mSJNWl1puJZOY9wJHDbLuLYr1k\nSZIkqavVvU6yJEmSNOmZJEuSJEkVJsmSJElShUmyJEmSVGGSLEmSJFWYJEuSJEkVJsmSJElShUmy\nJEmSVGGSLEmSJFWYJEuSJEkVJsmSJElShUmyJEmSVGGSLEmSJFWYJEuSJEkVJsmSJElSRUeT5IjY\nKyLe2sk6JEmSpLp1uif508CsoScRsV9EzI+IwYhYGBFHdbh+SZIkqWUdS5Ij4mjgucCnyufTgBuA\nK4CdgNOASyJi/07FIEmSJLWjI0lymRD/K3BqZm4oi48FFmbmhZn5RGYuAM4F3tOJGCRJkqR2daon\n+e+BmzLzJw1lhwDXVfa7GjiiQzFIkiRJbak9SY6IPYH3AkdGxCMRcX5EBLAXcHfjvpm5DNguIqbW\nHYckSZLUrk70JH8Q+C7QCxwIvAw4HZgODDbZfw0wowNxSJIkSW2JzKz3hBEPAs/PzMfK5/sDXwfu\nAT5ejkVu3H8V0JOZT1TKe4GBQw89lJ6eno3q6Ovro6+vr9a4JalT+vv76e/v36R83rx5x2Xmphtq\nZnsqaUsw3m1prUlyROwK3JyZ+1bKVwCXAz/JzMsbymcDt2bmXk3O1QsMDAwM0NvbW1uMktRFYlwq\nsT2VtGXrSFta93CLZcDOEfFUV0XZk3w/sACorov8RuDGmmOQJEmSxqTWJDmLbunLgC9HxG4R8Vzg\nYoq1kq8FDoqI4yNiSkQcDJwFnF9nDJIkSdJYdWLi3tnAfcAdFL3EV2bmlzJzLTAHOBVYSZE8n5KZ\nizoQgyRJktS2KXWfMDPXAXPLR3XbXRTrJUuSJEldq2O3pZYkSZImK5NkSZIkqcIkWZIkSaowSZYk\nSZIqTJIlSZKkCpNkSZIkqcIkWZIkSaowSZYkSZIqTJIlSZKkCpNkSZIkqcIkWZIkSaowSZYkSZIq\nTJIlSZKkCpNkSZIkqcIkWZIkSaroaJIcEWdFxKzy5/0iYn5EDEbEwog4qpN1S5IkSe3qWJIcEQcA\n55U/TwNuAK4AdgJOAy6JiP07Vb8kSZLUro4kyRExFfgqsG1ZdCywMDMvzMwnMnMBcC7wnk7UL0mS\nJI1Fp3qSzwN+BjxQPj8EuK6yz9XAER2qX5IkSWpb7UlyRLwMeCNwekPxXsDdjftl5jJgu7LXWZIk\nSeoatSbJEbEDcCnw1sxc2bBpBjDY5JA15TZJkiSpa0yp+XyfBq7JzPkNZQGsBqY32X8WzZPnp8yd\nO5eenp6Nyvr6+ujr6xtjqJI0Pvr7++nv79+kfN68eX2ZuemGDrE9lTSZjXdbGplZz4kijgauBZ5s\nKN4OWAssBj6UmZc37D8buDUz9xrmfL3AwMDAAL29vbXEKEldJsalEttTSVu2jrSltQ23yMxvZeZ2\nmTlz6AHcD+wB/ANQXRf5jcCNddUvSZIk1aXTd9yL8nENcFBEHB8RUyLiYOAs4PwO1y9JkiS1rNNJ\ncgJk5lpgDnAqsBK4GDglMxd1uH5JkiSpZXVP3NtIZu7T8PNdFOslS5IkSV2t0z3JkiRJ0qRjkixJ\nkiRVmCRLkiRJFSbJkiRJUoVJsiRJklRhkixJkiRVmCRLkiRJFSbJkiRJUoVJsiRJklRhkixJkiRV\ndPS21Nq6rVixgsHBwbaOnTlzJj09PTVHJEmSNDomyeqIFStWcN55F7B06fq2jt9116l84ANnmChL\n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\n43n88SUtJdWtjn9/+OGfs379l0e9v+1X541nkrwXcHeT8l8C+wDDJsnLly/ngQfW84xnHMuUKTNa\nrviBB77JQw891PJxQ5pdzl2zZg2LFy8e1fEuMSMNbyxDPTY3pGjoD8aRjGU89FiXvusGa9eu5frr\nv8nKlatGfcyzn70Hr3zl4URER2Jq5X3dElbiaeWPxC3h9Y5Wq23DeE04byWp7uT+0F2TPrdE45kk\nz6AYj1y1utxWNR1g0aJFzJw5k0ceWczq1f/NlCnTW654+fLfsHDhky0fB7Bq1Sq+/vXvsGrVxr8M\nbr/9F7z97R8a1Tm2334Db3rTUWy//fYt1f3II4+wZMlvefzxHzJ9+jNGfdyqVQ9x993fZfny+1i7\n9lEeeOBHrFp1b0t1j+XYkY4fim0i6t6cVase4oEHbu6692wotpHet4l6zwDWrFnOhg0xprpXrFjF\nI488iyefbG2C6YoVD/DYYwPcd99/8uijv9xk++betzVrHmXVqvu56aabmDVrVkt1D9c2tKgnImZm\nZqcz7afa06rf/va3fOlL/04r/QjPfvY61q1bw5Qp9fwKeeihh/jud4vPqdX3dc2aVdxzz+/4kz/Z\nj512euZm92/1u97q97vV8z/22O+4884FvPvdi5k+ffO/3xpfbyfa01b2b7XNaieWVtqGzbUH1dg6\n+d60u/+GDetb+G4+ytq1i7n99ttH3Wk3FitWrOC2227reD1t6khbGplZ5/mGryji/wAzMvMfK+Xf\nAv4lM2+slB8HXDEuwUnSxPmzzOzobx7bU0lbgdrb0vHsSf4NcGST8ucCzf5k+i7wN8CvgTWdC0uS\nJtRd41CH7amkLV3tbel49iQ/C/gx8NzM3FCW/QlwXWb+4bgEIUmSJI3CNuNVUWb+HvgR8KmI2D4i\nng18AThvvGKQJEmSRmPckuTSqcAs4EHgZuAbmXnZOMcgSZIkjWjchltIkiRJk8V49yRLkiRJXc8k\nWZIkSaowSZYkSZIqTJIlSZKkCpNkSZIkqcIkWZIkSaowSZYkSZIqTJIlSZKkCpNkSZIkqcIkWZIk\nSaowSZYkSZIqTJIlSZKkCpNkSZIkqcIkWZIkSaowSZYkSZIqTJK11YmInog4baLjkKTJwnZTWyOT\n5K1ARNwUEesjYk1ErIqI2yLiL1o8x30RMatTMY5FROwREf8WEcsjYlFEnLCZQ54BvHMz53xmRHwz\n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\nbyNTsTq13uTXzSJ5DkV/5KoN5bKq2QC33347Dz20ghUrPkrELg0fbNOmh1i2bC+uuuqqpoJcv349\nX//6d1i/Pna43pIlt/KWt3zg4ee7776Nv/zLo5oa9f3AAw+wcuXdrFv3Q2bP3rOhbR58cDmbNj3E\nPff8iPXr7xjnNdzHbbdd1fR2rRyr2e3qxdapYzW7zXixVbdbvfpWtm1b09UYdxZbO47V6uvavHkd\nK1cuaWibNWvu5eabF/Oud61g9uzZDR9rdHQTv/rVHey330FNFcpLl97CD37wA+b27/XueRExkJnN\nT2PSnNkAy5Yt227B3Xff3XCOXbt2JSMjD3LXXTvPWc181kuW3MqJJ5620xw6ljN3330Zs2fvuItP\nM78LzeSsRvfbruPveN3GclYvYl2//j7uuee6tu+3mZ+rjRvXc/vt9/K0px3CHnv8ziNiq75v7djv\n9us9xKZNK1iyZEnDXdKGh4e58cYbG1q32/o5NjqUSyOzsRHNEz5QxN8CczLzQ5X2K4F/zsyrK+2v\nBi7uSnCS1DvPzMyO/uUxn0qaBtqeS7t5JvlXwJF12g8E6n1tvAp4DXAn0NgoEUmafG7pwjHMp5Km\nurbn0m6eSX4s8GPgwMzcVrY9Dbg8M5/UlSAkSZKkBjTeyXeCMvPXwI+AT0TE7hHxBODTwFndikGS\nJElqRNeK5NKJwHzgN8B1wCWZ+YUuxyBJkiTtUNe6W0iSJEmTRbfPJEuSJEl9zyJZkiRJqrBIliRJ\nkioskiVJkqQKi2RJkiSpwiJZkiRJqrBIliRJkioskiVJkqQKi2RJkiSpwiJZkiRJqrBIliRJkios\nkiVJkqQKi2RJkiSpwiJZkiRJqrBIliRJkioskjXtRMS8iDip13FI0mRh3tR0ZJE8DUTENRExGhEb\nI2J9RNwYEX/W5D6WR8T8TsU4ERHxjIhYHBFrI+KGiHjhTjbZE3jbTvb5OxHx7XKfP42IZ7Uv4v4T\nEWdExKm9jkPqF+bN7UzavBkRu0TEDyNidbOfYQdi2T8ilvYyBjXOInl6SOA5mTkb2As4A7goIp7Y\n5D76TkQMAFcA/xd4NPC/KF7bE3ay6c5ez8eB7wLzgU8D34yI3SYYrqTJw7y5vcmaN38PmAPsA1zX\n41igT38utD2L5OkjADJzQ2YuAr4BHNvs9n1oL+DUzPxKZm7JzMXA9cCzJ7jf3wcuyczRzPwM8PuZ\n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\ntcbYWtaRXNry7Bad1u+jsaerFStWcPrpF7BgwYlN90leu3YFq1dfwEc+ciL77mt/Zon688e3/yDm\nU0lTW0dyqWeSJUmSpAqLZEmSJKnCIlmSJEmqsEiWJEmSKiySJUmSpAqLZEmSJKnCIlmSJEmqsEiW\nJEmSKiySJUmSpAqLZEmSJKnCIlmSJEmqsEiWJEmSKiySJUmSpIqWiuSI+F5EbI2IUyvth0TEtREx\nEhFLI+KoyvKXRcStEbE+Iq6OiIMmErwkSZLUCS0VyZn5QuDM2raImAVcAVwM7AGcBFwYEYeWyw8D\nzgfeBMwDvgF8p9xOkiRJ6hsT6W4RlefHAUsz8/zM3JKZiykK6XeVy08G/ikzF5fLLwB+Arx6AjFI\nkiRJbdfOPslHAJdX2i4FXtTgckmSJKkvtLNI3g+4rbYhM1cDs8suFY/LzDsq29wKPLGNMUiSJEkT\n1s4ieQ4wUqd9Q7ms3rHGlkmSJEl9Y0Yb97UBmF2nfT5F8bytzrIF1C+sH3bKKacwb968R7QNDg4y\nODjYYpiS1F1DQ0MMDQ1t175o0aLBzNx+QYeYTyVNZt3Ope0skn8FHAgsHmuIiH2ABzJzNCLujYgn\nZObdNdscCFS7YDzCOeecw8KFC9sYpiR11w4K0a4VyGA+lTS5dTuXtrO7xWLgqErb8cDVO1j+yprl\nkiRJUl9oZ5F8GfDsiDghImZExHOB04Czy+XnAu+JiOeUy98IHEaXz6RIkiRJO9O2IjkzNwHHACcC\na4HPAG/OzGXl8puAdwAXAcMU8yO/JDNH2xWDJEmS1A4t90nOzDPrtN1CMR/yeNt8C/hWq8eUJEmS\nuqGd3S0kSZKkKcEiWZIkSaqwSJYkSZIqLJIlSZKkCotkSZIkqcIiWZIkSaqwSJYkSZIqLJIlSZKk\nCotkSZIkqcIiWZIkSaqwSJYkSZIqLJIlSZKkCotkSZIkqcIiWZIkSaqwSJYkSZIq2lokR8T8iLgo\nIlZHxJ0RcUrNskMi4tqIGImIpRFxVDuPLUmSJLVLu88kfxFYBjweeDbwRxHx2oiYBVwBXAzsAZwE\nXBgRh7b5+JIkSdKEzWjz/o4AXp6ZW4ANEfGvwDuAUWBpZp5frrc4Is4E3g28vs0xSJIkSRPS7jPJ\n3wY+FhF7RMQTgH8AVlAUz5dX1r0UeFGbjy9JkiRNWLuL5HcCxwEPAncB+wBnAvsBt9WumJmrgd0i\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1260eb190>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "'''\n",
    "0、空值处理\n",
    "\n",
    "- 均值 +- 标准差，随机取\n",
    "- 根据其他相关联特征猜测特征，median Age for Pclass=1 and Gender=0, Pclass=1 and Gender=1,\n",
    "- 结合1，2\n",
    "随机，随机噪声\n",
    "'''\n",
    "\n",
    "# 确定分布情况\n",
    "grid = sns.FacetGrid(df, row='Pclass', col='Sex', size=2.2, aspect=1.6)\n",
    "grid.map(plt.hist, 'Age', alpha=.5, bins=20)\n",
    "grid.add_legend()\n",
    "\n",
    "combine = [features_train, features_test]\n",
    "guess_ages = np.zeros((2,3))\n",
    "\n",
    "# 针对年龄，\n",
    "for dataset in combine:\n",
    "    for i in range(0, 2):\n",
    "        for j in range(0, 3):\n",
    "            \n",
    "            # 去除NUll值\n",
    "            guess_df = dataset[(dataset['Sex'] == i) & (dataset['Pclass'] == j + 1)]['Age'].dropna()\n",
    "            \n",
    "\n",
    "            # age_mean = guess_df.mean()\n",
    "            # age_std = guess_df.std()\n",
    "            # age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std)\n",
    "            age_guess = guess_df.median()  # 中位数\n",
    "    \n",
    "            # Convert random age float to nearest .5 age\n",
    "            guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5\n",
    "            \n",
    "    for i in range(0, 2):\n",
    "        for j in range(0, 3):\n",
    "            # loc 横坐标/逻辑表达式， 纵坐标\n",
    "            dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),\\\n",
    "                    'Age'] = guess_ages[i,j]\n",
    "\n",
    "    dataset['Age'] = dataset['Age'].astype(int)\n",
    "\n",
    "features_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "9221567a-83eb-4bfc-a98a-458207142aab"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AgeBand</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(-0.08, 16]</td>\n",
       "      <td>0.550000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(48, 64]</td>\n",
       "      <td>0.434783</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(32, 48]</td>\n",
       "      <td>0.403226</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(16, 32]</td>\n",
       "      <td>0.344762</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(64, 80]</td>\n",
       "      <td>0.090909</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       AgeBand  Survived\n",
       "0  (-0.08, 16]  0.550000\n",
       "3     (48, 64]  0.434783\n",
       "2     (32, 48]  0.403226\n",
       "1     (16, 32]  0.344762\n",
       "4     (64, 80]  0.090909"
      ]
     },
     "execution_count": 228,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 【Age】年龄特征 验证相关性\n",
    "\n",
    "features_train['AgeBand'] = pd.cut( features_train['Age'], 5)  # 可更改类别数字大小\n",
    "features_train[ ['AgeBand', 'Survived'] ].groupby('AgeBand', as_index = False).mean().sort_values(by = 'Survived', ascending = False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "c2ebd0ce-9749-48e4-95c2-7446eb1c786a"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "      <th>AgeBand</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>(16, 32]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "      <td>(32, 48]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "      <td>(16, 32]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "      <td>(32, 48]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>(32, 48]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age  SibSp  Parch     Fare Embarked  \\\n",
       "0            1         0       3    0    1      1      0   7.2500        S   \n",
       "1            2         1       1    1    2      1      0  71.2833        C   \n",
       "2            3         1       3    1    1      0      0   7.9250        S   \n",
       "3            4         1       1    1    2      1      0  53.1000        S   \n",
       "4            5         0       3    0    2      0      0   8.0500        S   \n",
       "\n",
       "   title   AgeBand  \n",
       "0      1  (16, 32]  \n",
       "1      3  (32, 48]  \n",
       "2      2  (16, 32]  \n",
       "3      3  (32, 48]  \n",
       "4      1  (32, 48]  "
      ]
     },
     "execution_count": 229,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 分类特征 -> 数字\n",
    "\n",
    "for dataset in combine:    \n",
    "    dataset.loc[ dataset['Age'] <= 16, 'Age'] = 0\n",
    "    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1\n",
    "    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2\n",
    "    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3\n",
    "    dataset.loc[ dataset['Age'] > 64, 'Age']\n",
    "    \n",
    "features_train.head()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 230,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "92165036-e453-4a04-8a6f-48b937ace21d"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age  SibSp  Parch     Fare Embarked  \\\n",
       "0            1         0       3    0    1      1      0   7.2500        S   \n",
       "1            2         1       1    1    2      1      0  71.2833        C   \n",
       "2            3         1       3    1    1      0      0   7.9250        S   \n",
       "3            4         1       1    1    2      1      0  53.1000        S   \n",
       "4            5         0       3    0    2      0      0   8.0500        S   \n",
       "\n",
       "   title  \n",
       "0      1  \n",
       "1      3  \n",
       "2      2  \n",
       "3      3  \n",
       "4      1  "
      ]
     },
     "execution_count": 230,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_train = features_train.drop(['AgeBand'], axis=1)\n",
    "combine = [features_train, features_test]\n",
    "features_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "nbpresent": {
     "id": "05a0ce76-90f5-448f-9714-345725280c31"
    }
   },
   "source": [
    "家庭成员特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 231,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "b14817ac-dd46-475f-98f8-179cd9ef547c"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FamilySize</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0.724138</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0.578431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.552795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>0.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.303538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>0.136364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>11</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   FamilySize  Survived\n",
       "3           4  0.724138\n",
       "2           3  0.578431\n",
       "1           2  0.552795\n",
       "6           7  0.333333\n",
       "0           1  0.303538\n",
       "4           5  0.200000\n",
       "5           6  0.136364\n",
       "7           8  0.000000\n",
       "8          11  0.000000"
      ]
     },
     "execution_count": 231,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 验证 \n",
    "for dataset in combine:\n",
    "    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1\n",
    "\n",
    "features_train[['FamilySize', 'Survived']].groupby(['FamilySize'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "2d1360fa-471d-440f-b7ad-8c611f394333"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "      <th>IsAlone</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age     Fare Embarked  title  IsAlone\n",
       "0            1         0       3    0    1   7.2500        S      1        0\n",
       "1            2         1       1    1    2  71.2833        C      3        0\n",
       "2            3         1       3    1    1   7.9250        S      2        1\n",
       "3            4         1       1    1    2  53.1000        S      3        0\n",
       "4            5         0       3    0    2   8.0500        S      1        1"
      ]
     },
     "execution_count": 232,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 验证\n",
    "for dataset in combine:\n",
    "    dataset['IsAlone'] = 0\n",
    "    dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1\n",
    "\n",
    "features_train[['IsAlone', 'Survived']].groupby(['IsAlone'], as_index=False).mean()\n",
    "\n",
    "features_train = features_train.drop(['Parch', 'SibSp', 'FamilySize'], axis=1)\n",
    "features_test = features_test.drop(['Parch', 'SibSp', 'FamilySize'], axis=1)\n",
    "combine = [features_train, features_test]\n",
    "\n",
    "features_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "f0e3ad19-37ef-48af-a517-07f40c702c8f"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "      <th>IsAlone</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age     Fare Embarked  title  IsAlone\n",
       "0            1         0       3    0    1   7.2500        S      1        0\n",
       "1            2         1       1    1    2  71.2833        C      3        0\n",
       "2            3         1       3    1    1   7.9250        S      2        1\n",
       "3            4         1       1    1    2  53.1000        S      3        0\n",
       "4            5         0       3    0    2   8.0500        S      1        1"
      ]
     },
     "execution_count": 233,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "394499f8-0265-4da0-a6be-215edfe0735a"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age*Class</th>\n",
       "      <th>Age</th>\n",
       "      <th>Pclass</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Age*Class  Age  Pclass\n",
       "0          3    1       3\n",
       "1          2    2       1\n",
       "2          3    1       3\n",
       "3          2    2       1\n",
       "4          6    2       3\n",
       "5          3    1       3\n",
       "6          3    3       1\n",
       "7          0    0       3\n",
       "8          3    1       3\n",
       "9          0    0       2"
      ]
     },
     "execution_count": 234,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Age*Class'] = dataset.Age * dataset.Pclass\n",
    "\n",
    "features_train.loc[:, ['Age*Class', 'Age', 'Pclass']].head(10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "13e1221b-5b88-4c93-81bc-ee5805f0b020"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>C</td>\n",
       "      <td>0.553571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q</td>\n",
       "      <td>0.389610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S</td>\n",
       "      <td>0.339009</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Embarked  Survived\n",
       "0        C  0.553571\n",
       "1        Q  0.389610\n",
       "2        S  0.339009"
      ]
     },
     "execution_count": 235,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "freq_port = features_train.Embarked.dropna().mode()[0]\n",
    "freq_port\n",
    "for dataset in combine:\n",
    "    dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)\n",
    "    \n",
    "features_train[['Embarked', 'Survived']].groupby(['Embarked'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "cdb839ec-c269-402a-bb3e-2ced8aff04a1"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age     Fare  Embarked  title  IsAlone  \\\n",
       "0            1         0       3    0    1   7.2500         0      1        0   \n",
       "1            2         1       1    1    2  71.2833         1      3        0   \n",
       "2            3         1       3    1    1   7.9250         0      2        1   \n",
       "3            4         1       1    1    2  53.1000         0      3        0   \n",
       "4            5         0       3    0    2   8.0500         0      1        1   \n",
       "\n",
       "   Age*Class  \n",
       "0          3  \n",
       "1          2  \n",
       "2          3  \n",
       "3          2  \n",
       "4          6  "
      ]
     },
     "execution_count": 236,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Embarked'] = dataset['Embarked'].map( {'S': 0, 'C': 1, 'Q': 2} ).astype(int)\n",
    "\n",
    "features_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "c9e66d64-0766-446e-b209-02065bbaf86f"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>892</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>7.8292</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>893</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>7.0000</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>894</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>9.6875</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>895</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>8.6625</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>896</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>12.2875</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Pclass  Sex  Age     Fare  Embarked  title  IsAlone  Age*Class\n",
       "0          892       3    0    2   7.8292         2      1        1          6\n",
       "1          893       3    1    2   7.0000         0      3        0          6\n",
       "2          894       2    0    3   9.6875         2      1        1          6\n",
       "3          895       3    0    1   8.6625         0      1        1          3\n",
       "4          896       3    1    1  12.2875         0      3        0          3"
      ]
     },
     "execution_count": 237,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_test['Fare'].fillna(features_test['Fare'].dropna().median(), inplace=True)\n",
    "features_test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "d5e7595b-9e38-4fc7-b73b-cdb6a3f5a3aa"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  Sex  Age  Fare  Embarked  title  IsAlone  \\\n",
       "0            1         0       3    0    1     0         0      1        0   \n",
       "1            2         1       1    1    2     3         1      3        0   \n",
       "2            3         1       3    1    1     1         0      2        1   \n",
       "3            4         1       1    1    2     3         0      3        0   \n",
       "4            5         0       3    0    2     1         0      1        1   \n",
       "5            6         0       3    0    1     1         2      1        1   \n",
       "6            7         0       1    0    3     3         0      1        1   \n",
       "7            8         0       3    0    0     2         0      4        0   \n",
       "8            9         1       3    1    1     1         0      3        0   \n",
       "9           10         1       2    1    0     2         1      3        0   \n",
       "\n",
       "   Age*Class  \n",
       "0          3  \n",
       "1          2  \n",
       "2          3  \n",
       "3          2  \n",
       "4          6  \n",
       "5          3  \n",
       "6          3  \n",
       "7          0  \n",
       "8          3  \n",
       "9          0  "
      ]
     },
     "execution_count": 238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 验证FareBand, 删除\n",
    "features_train['FareBand'] = pd.qcut(features_train['Fare'], 4)\n",
    "features_train[['FareBand', 'Survived']].groupby(['FareBand'], as_index=False).mean().sort_values(by='FareBand', ascending=True)\n",
    "\n",
    "for dataset in combine:\n",
    "    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0\n",
    "    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1\n",
    "    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2\n",
    "    dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3\n",
    "    dataset['Fare'] = dataset['Fare'].astype(int)\n",
    "\n",
    "features_train = features_train.drop(['FareBand'], axis=1)\n",
    "combine = [features_train, features_test]\n",
    "    \n",
    "features_train.head(10)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "53ecb653-4d96-44e0-aa89-047ce572e972"
    }
   },
   "outputs": [],
   "source": [
    "features_train_new = features_train\n",
    "labels_train_new = labels_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "0641784a-1432-496f-8103-58f31b2bff00"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "PassengerId    2\n",
      "Survived       1\n",
      "Pclass         1\n",
      "Sex            1\n",
      "Age            2\n",
      "Fare           3\n",
      "Embarked       1\n",
      "title          3\n",
      "IsAlone        0\n",
      "Age*Class      2\n",
      "Name: 1, dtype: int64\n",
      "(891, 10)\n",
      "(418, 9)\n",
      "Index([u'PassengerId', u'Survived', u'Pclass', u'Sex', u'Age', u'Fare',\n",
      "       u'Embarked', u'title', u'IsAlone', u'Age*Class'],\n",
      "      dtype='object') Index([u'PassengerId', u'Pclass', u'Sex', u'Age', u'Fare', u'Embarked',\n",
      "       u'title', u'IsAlone', u'Age*Class'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "print features_train_new.loc[1, 'Sex'] # loc取值\n",
    "print features_train_new.iloc[1] # iloc取值\n",
    "print features_train_new.shape\n",
    "print features_test.shape\n",
    "print features_train.columns, features_test.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "aab2c896-9bd8-419f-9692-16712aa25633"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(418, 9)\n"
     ]
    }
   ],
   "source": [
    "# 1.3.1 DicVectorizer方法\n",
    "# from sklearn.feature_extraction import DictVectorizer\n",
    "# vec = DictVectorizer(sparse = False)\n",
    "# features_train = vec.fit_transform(features_train.to_dict(orient = 'record'))\n",
    "# features_test = vec.fit_transform(features_test.to_dict(orient = 'record'))\n",
    "# print (vec.feature_names_)\n",
    "# print features_train\n",
    "\n",
    "# 1.3.2 存在非数字类别的数据，Get_dummies方法，独热编码, 为什么One hot 而不是 每个分一个值【待】\n",
    "\n",
    "features_train_new = pd.get_dummies(features_train_new)\n",
    "features_test = pd.get_dummies(features_test)\n",
    "\n",
    "# 因为训练集和测试集数据不同，独热编码后测试集有缺失，全填为0\n",
    "missing_cols = set(features_train_new.columns) - set(features_test.columns)\n",
    "for c in missing_cols:\n",
    "    features_test[c] = 0\n",
    "    \n",
    "# features_test = features_test[features_train_new.columns]\n",
    "\n",
    "# 1.3.3 因为只有两个类，replace\n",
    "\n",
    "# features_train.loc[:,'Sex'] = features_train['Sex'].replace(['male','female'], [0, 1])\n",
    "# features_test.loc[:,'Sex'] = features_test['Sex'].replace(['male','female'], [0, 1])\n",
    "\n",
    "features_train_new = features_train.drop( ['Survived'], axis=1)\n",
    "print features_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 253,
   "metadata": {
    "collapsed": false,
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "delet = ['PassengerId']\n",
    "features_train_new = features_train_new.drop(delet, axis=1)\n",
    "features_test = features_test.drop(delet, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 284,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Pclass  Sex  Age  Fare  Embarked  title  IsAlone  Age*Class\n",
      "0       3    0    1     0         0      1        0          3\n",
      "1       1    1    2     3         1      3        0          2\n",
      "2       3    1    1     1         0      2        1          3\n",
      "3       1    1    2     3         0      3        0          2\n",
      "4       3    0    2     1         0      1        1          6\n"
     ]
    }
   ],
   "source": [
    "print features_train_new.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "3f2f95ec-dfa0-4a8b-af51-fc9a50b4c19f"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "712\n",
      "179\n",
      "     Pclass  Sex  Age  Fare  Embarked  title  IsAlone  Age*Class\n",
      "331       1    0    2     2         0      1        1          2\n",
      "733       2    0    1     1         0      1        1          2\n",
      "382       3    0    1     1         0      1        1          3\n",
      "704       3    0    1     0         0      1        0          3\n",
      "813       3    1    0     3         0      2        0          0      Pclass  Sex  Age  Fare  Embarked  title  IsAlone  Age*Class\n",
      "709       3    0    1     2         1      4        0          3\n",
      "439       2    0    1     1         0      1        1          2\n",
      "840       3    0    1     1         0      1        1          3\n",
      "720       2    1    0     3         0      2        0          0\n",
      "39        3    1    0     1         1      2        0          0 331    0\n",
      "733    0\n",
      "382    0\n",
      "704    0\n",
      "813    0\n",
      "Name: Survived, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# # 1.4 混洗，切分数据\n",
    "# from sklearn.model_selection import train_test_split\n",
    "\n",
    "# X_train, X_test, y_train, y_test = train_test_split(features_train_new, labels_train_new, test_size = 0.2, random_state = 42)\n",
    "# print X_train.shape[0]\n",
    "# print X_test.shape[0]\n",
    "# print X_train.head(), X_test.head(), y_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 296,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "eb2abab7-2d13-4c9b-8d79-f4f62dce7871"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'LogisticRegression': 0.80359147025813693, 'DecisionTreeClassifier': 0.86980920314253651, 'SVC': 0.83950617283950613, 'RandomForestClassifier': 0.86644219977553316}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "'''\n",
    "2、确定算法，训练预测， enter\n",
    "   0、初始模型评估：可用算法：决策树，随机森林，SVM，逻辑回归，KNN, 朴素贝叶斯\n",
    "   1、训练中，网格搜索调参，寻找最符合训练集的参数\n",
    "\n",
    "'''\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import fbeta_score, make_scorer, accuracy_score  #F1值 新建打分对象\n",
    "\n",
    "## 2.0初始模型评估\n",
    "\n",
    "# TODO：初始化模型\n",
    "clf_A = SVC(random_state=42)\n",
    "clf_B = LogisticRegression(random_state=42)\n",
    "clf_C = RandomForestClassifier(random_state=42)\n",
    "clf_D = DecisionTreeClassifier(random_state=42)\n",
    "\n",
    "\n",
    "# 收集学习器的结果\n",
    "results = {}\n",
    "for clf in [clf_A, clf_B, clf_C, clf_D]:\n",
    "# for clf in [clf_B, clf_C]:\n",
    "    clf_name = clf.__class__.__name__\n",
    "    clf.fit(features_train_new, labels_train_new)  # 尽可能多的数据\n",
    "    pred_y_test = clf.predict(features_train_new)\n",
    "    results[clf_name] = accuracy_score(pred_y_test, labels_train_new)\n",
    "\n",
    "print results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 299,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "6795c1df-d63f-4ddc-93bc-c589da74fe1e"
    }
   },
   "outputs": [],
   "source": [
    "# 2.1 网格搜索，枚举参数, Decison Tree\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "\n",
    "# 2.1.1 初始化分类器\n",
    "# clf = DecisionTreeClassifier(random_state = 42)\n",
    "\n",
    "# # # 2.1.2 希望调节的参数列表\n",
    "# parameters = {'min_samples_split':range(2,8), 'max_depth':range(10,101,10)}\n",
    "    \n",
    "# # 2.1.3 创建打分对象\n",
    "# scorer = make_scorer(accuracy_score)\n",
    "\n",
    "# # 2.1.4 分类器上使用网格搜索\n",
    "# grid_clf = GridSearchCV(clf, parameters, scoring= scorer)\n",
    "\n",
    "# # 2.1.5 训练\n",
    "# grid_clf.fit(features_train_new, labels_train_new)\n",
    "\n",
    "# # 2.1.6 最佳拟合分类器\n",
    "# best_clf = grid_clf.best_estimator_\n",
    "# pred_y_test = best_clf.predict(features_train_new)\n",
    "\n",
    "\n",
    "# # Random Forest\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "clf = RandomForestClassifier(random_state = 42)\n",
    "parameters = {'min_samples_split':range(2,5), 'max_depth':range(10,101,10)}\n",
    "scorer = make_scorer(accuracy_score)\n",
    "grid_clf = GridSearchCV(clf, parameters, scoring=scorer)\n",
    "grid_clf.fit(features_train_new, labels_train_new)\n",
    "best_clf = grid_clf.best_estimator_\n",
    "pred_y_test = best_clf.predict(features_train_new)\n",
    "\n",
    "# 线性SVM\n",
    "# from sklearn.svm import SVC\n",
    "# clf = SVC(random_state = 42)\n",
    "# parameters = {'C': [1e-3, 1e-2, 1e-1, 1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}   \n",
    "# scorer = make_scorer(accuracy_score)\n",
    "# grid_clf = GridSearchCV(clf, parameters, scoring=scorer)\n",
    "# grid_clf.fit(X_train, y_train)\n",
    "# best_clf = grid_clf.best_estimator_\n",
    "# pred_y_test = best_clf.predict(X_test)\n",
    "\n",
    "# from sklearn.linear_model import LogisticRegression\n",
    "# clf = LogisticRegression(random_state=42)\n",
    "# # parameters = {\n",
    "# # scorer = make_scorer(accuracy_score)\n",
    "# clf.fit(X_train,y_train)\n",
    "# pred_y_test = clf.predict(X_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 确定评分标准"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 300,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "8c917f76-4a83-44f9-aae9-98475e6dbff4"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.863075196409\n"
     ]
    }
   ],
   "source": [
    "print accuracy_score(pred_y_test, labels_train_new)\n",
    "\n",
    "pred = best_clf.predict(features_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 导出结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 302,
   "metadata": {
    "collapsed": false,
    "nbpresent": {
     "id": "a5166baf-9317-4651-afb6-da487c600e57"
    }
   },
   "outputs": [],
   "source": [
    "df3 = pd.DataFrame(pred)\n",
    "df3.index = df2['PassengerId']\n",
    "df3.rename(columns={df3.columns[0]:'Survived'}, inplace=True)\n",
    "df3.to_csv('predict.csv')"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
